/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package IDE;

import CONTROLADOR.Controlador;
import MODELO.Modelo;
import LEXICO.*;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;

import java.awt.event.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;

import javax.swing.text.*;

/**
 *
 * @author Laura
 */
public class Vista extends JPanel {
    public Controlador controlador;
    private Modelo modelo;
    public JFrame IDE;

    //Declaracion del menu del compilador
    public static JMenuBar barraMenu = new JMenuBar(); //crea la barra del menu
    public static JMenu menuFile = new JMenu("File"); //crea el menu File
    public static JMenu menuRun = new JMenu("Run"); //crea el menu File
    public static JMenuItem nuevo_archivo = new JMenuItem("New File"); //opcion nuevo archivo del menu
    public static JMenuItem abrir_archivo = new JMenuItem("Open File"); //opcion abrir archivo del menu
    public static JMenuItem guardar_archivo = new JMenuItem("Save File");//opcion guardar archivo del menu
    public static JMenuItem salir = new JMenuItem("Exit"); //opcion salir dem menu
    public static JMenuItem run = new JMenuItem("Run Proyect"); //opcion salir dem menu
    public static String dir_com="";


    //En esta sección se declaran todas las imagenes usadas en el compilador
    public static JLabel panel1 = new JLabel(new ImageIcon("pan1.png"));
    public static JLabel guardar = new JLabel(new ImageIcon("save.png"));
    public static JLabel compilar = new JLabel(new ImageIcon("play.png"));
    public static JLabel new_file = new JLabel(new ImageIcon("file_new.png"));
    public static JLabel open_file = new JLabel(new ImageIcon("files_add.png"));
    //Aqui se declarara lo referente al editor de codigo al JTextArea
    int antes,despues;
    final private DefaultStyledDocument doc;
    public JTextPane hoja;
    public List<String> tokens;
    public JFrame frame3;
    public JTextPane area_tokens;
    public JTextField busco;
    public JButton buscar;


    private final Style azul;
    String[] reservadas_bloque={"ALGORITMO","INICIO","FIN ALGORITMO","VAR","CONST"};
    String[] reservadas={"SIMPLE","ENTERO","DOBLE","CARACTER","CADENA","LOGICO","VECTOR","MATRIZ","FIN","SINO","SI","ENTOCES","SELECCION","CASO","SELECCIONA","PARA","DESDE","HASTA","MIENTRAS","HAZ","REPITE","HASTA","QUE","ABANDONA","TIPO","REGISTRO","CON","SUBRUTINA","MODULO","FUNCION","Por_Refer variable","ALGORITMO","INICIO","FIN ALGORITMO","VAR","CONST"};
    private final Style verde;
    private final Style negro;
    private DefaultStyledDocument doc2;
    private Style selec;

    public Vista(Modelo mod,JFrame con){
   
         antes=0;
        despues=0;
        this.modelo=mod;
        this.IDE=con;
          IDE.setResizable(false);   
        
   //     IDE.pack();
        Dimension fullscrean = Toolkit.getDefaultToolkit().getScreenSize();
        IDE.setBounds(0,0,fullscrean.width,fullscrean.height);


        menuFile.add(nuevo_archivo);
        menuFile.addSeparator();
        menuFile.add(abrir_archivo);
        menuFile.addSeparator();
        menuFile.add(guardar_archivo);
        menuFile.addSeparator();
        menuFile.add(salir);
        menuRun.add(run);
        barraMenu.add(menuFile);
        barraMenu.add(menuRun);
        IDE.setJMenuBar(barraMenu);
        IDE.setVisible(true);
        IDE.repaint();

        //Seccion de codigo dedicada a la configuracion de propiedades de Imagenes

     

        
        new_file.setBounds(30,9,32,32);
        IDE.getContentPane().add(new_file);
        open_file.setBounds(70,9,32,32);
        IDE.getContentPane().add(open_file);
        guardar.setBounds(150,9, 32,32);
        IDE.getContentPane().add(guardar);        
        compilar.setBounds(110,9,32,32);
        IDE.getContentPane().add(compilar);
        panel1.setBounds(0,0,1280,50);
        IDE.getContentPane().add(panel1);
        
        //configuracion de la hoja de edicion
       StyleContext sc = new StyleContext();
       doc= new DefaultStyledDocument(sc);
       hoja=new JTextPane(doc);

        // Define el estilo
         negro = sc.addStyle("ConstantWidth", null);
        StyleConstants.setForeground(negro, Color.black);

         verde = sc.addStyle("ConstantWidth", null);
        StyleConstants.setForeground(verde, Color.green);

         selec = sc.addStyle("ConstantWidth", null);
        StyleConstants.setForeground(selec, Color.YELLOW);
        StyleConstants.setBackground(selec, Color.LIGHT_GRAY);
        StyleConstants.setUnderline(selec, true);
         azul = sc.addStyle("ConstantWidth", null);
        StyleConstants.setForeground(azul, Color.blue);
       // StyleConstants.setBold(azul, true);


        

        hoja.setSize(800,500);
        hoja.setLocation(200,70);


    busco=new JTextField();
    busco.setBounds(fullscrean.width-220,10,100,30);
    IDE.getContentPane().add(busco);
    buscar= new JButton("Buscar");
    buscar.setBounds(fullscrean.width-110,10,80,30);
    IDE.getContentPane().add(buscar,1);
    buscar.setVisible(true);

Dimension fullscrean2 = Toolkit.getDefaultToolkit().getScreenSize();
JPanel pa=new JPanel();
pa.setLayout(null);
pa.setBounds(0,75,fullscrean2.width,fullscrean2.height-70);
JScrollPane slider = new JScrollPane(hoja);
pa.add(slider);

slider.setBounds(200,70,800,500);
        hoja.setVisible(false);
        
       // pa.add(textScroll);
     // pa.setVisible(true);
        IDE.getContentPane().add(pa);
        pa.setBounds(0,75,fullscrean2.width,fullscrean2.height-70);

        pa.repaint();
       
        
        frame3 = new JFrame("Tokens");
        frame3.setLayout(null);
        frame3.setBounds(200,200,300,300);
       // frame3.setLayout(new BorderLayout());
        frame3.setResizable(false);
        //StyleContext sc2 = new StyleContext();
        //doc2= new DefaultStyledDocument(sc2);
        area_tokens = new JTextPane();
        area_tokens.setText("Probando");
        area_tokens.setBackground(Color.black);
        area_tokens.setForeground(Color.white);
        area_tokens.setSize(800,500);
        area_tokens.setLocation(0,0);

        frame3.setBounds(200,200,805,405);
        JPanel to=new JPanel();
        to.setBounds(1,1,800,400);
        to.setLayout(null);
        //to.setBackground(Color.green);
        JScrollPane barra = new JScrollPane(area_tokens);
        to.add(barra);
        barra.setBounds(0,0,800,400);
        frame3.getContentPane().add(to);
        frame3.setVisible(false);
        //frame3.repaint();

        //Click nuevo archivo en el menu
        nuevo_archivo.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e){
                try {
                    crear_nuevo_archivo();
                } catch (IOException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
        });

        //Click cargar archivo en el menu
        abrir_archivo.addMouseListener(new MouseAdapter(){
        public void mousePressed(MouseEvent e){
                try {
                    cargar_archivo();
                } catch (IOException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
        });

        buscar.addMouseListener(new MouseAdapter(){
        public void mousePressed(MouseEvent e){
                  
          if(busco.getText()!="")
          {
            
            buscando(hoja,busco.getText());
           
          }
        }
        });



        //Click guardar archivo en el menu
        guardar_archivo.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e){
            if(dir_com.equals("")==false){
                guardar_archivo();
            }else{
                JOptionPane.showMessageDialog(IDE, "Debe crear o abrir primero un archivo.","Información",JOptionPane.INFORMATION_MESSAGE);
            }
        }
        });

        run.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e){
                try {
                    correr();
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
        });

  
        //Click IMAGEN guardar archivo en el menu
        guardar.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e){
            if(dir_com.equals("")==false){
                guardar_archivo();
            }else{
                JOptionPane.showMessageDialog(IDE, "Debe crear o abrir primero un archivo.","Información",JOptionPane.INFORMATION_MESSAGE);
            }
        }
        });
   hoja.addKeyListener(new KeyAdapter(){

         public void keyPressed(KeyEvent ke){
       
                 System.out.println(""+ke.getKeyCode());
                    try {
                       String aa=hoja.getText();
                       hoja.setText("");
                       hoja.setText(aa);
                        repintartex(hoja);
                    } catch (BadLocationException ex) {
                        Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                    }

                
          
         }


      });
      IDE.repaint();
        //Click IMAGEN new file
        new_file.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e){
            try {
                    crear_nuevo_archivo();
                } catch (IOException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
        });

        // Click IMAGEN open file
        open_file.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e){
            try {
                    cargar_archivo();
                } catch (IOException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                }
        }
        });
        compilar.addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                try {
                    correr();
                } catch (FileNotFoundException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IOException ex) {
                    Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

    }

    public void buscando(JTextPane a,String buscard){


      String tex="";
      String pal=a.getText()+" ";
      int inicio=0,fin=0;
      int bandera=0;
      int ban=0;
      String ca ="";
        for (int i = 0; i < pal.length();i++) {
            bandera=0;
            if(inicio!=fin)
               ca=pal.substring(inicio,fin);
            if(pal.charAt(fin)!=' ' && pal.charAt(fin)!='\n' && pal.charAt(fin)!='\r')
            {   //System.out.println(""+pal.charAt(fin));
                tex+=pal.charAt(fin);
                fin++;

            }
            else
            {
              if(inicio-1>0)
                if(pal.charAt(inicio-1)=='\n')
                { ban++;
                }
               int nop=0;
              if(pal.substring(inicio,fin).contains(buscard) && ban==0)
              {

                  doc.setCharacterAttributes(inicio+pal.substring(inicio,fin).indexOf(buscard),buscard.length(), selec, false);
              }
              if(pal.substring(inicio,fin).contains(buscard) && ban!=0)
              {
             doc.setCharacterAttributes(inicio+pal.substring(inicio,fin).indexOf(buscard),buscard.length(), selec, false);
             
              }
              inicio=fin+1;
                fin++;

            }

        }


    }





    public void correr() throws FileNotFoundException, IOException{
            tokens=new ArrayList<String>();            
            char a=(char)92;
            String a1=String.valueOf(a);
            String a2=a1+a1;
            String direccion="";
            for(int i=0;i<dir_com.length();i++)
            {
                if(dir_com.charAt(i)==a1.charAt(0)){
                    direccion+=a2;
                }
                else{
                   direccion+= dir_com.charAt(i);
                }
            }
            direccion+=".ent.txt";
            //System.out.println("oooooooiiiiiii "+direccion);
            contador con = new contador(direccion,tokens);
            a1="";
            for(String i : tokens){
                a1+=i+"\n";
            }
            area_tokens.setText(a1);
            frame3.setVisible(true);
    }



    //funcion que se llama cuando le dan click a guardar archivo
    public void guardar_archivo(){
        String[] vector = hoja.getText().split("\n");
        List<String> lineas = new ArrayList<String>();
        for(int i=0;i<vector.length;i++){
            lineas.add(vector[i]);
        }
        controlador.guardar_archivo(lineas,dir_com);
        //System.out.println("joooooo->"+dir_com);
    }
  public boolean existe_pal(String palabra)
    {
         int ban=0;
        for (int i = 0; i < reservadas.length; i++) {
            if(palabra.compareTo(reservadas[i])==0)
            {    ban=1;
                  break;
            }
        }
        if(ban==0) return false;
        else
        return true;

    }
     public boolean existe_bloque(String palabra)
    {
        int ban=0;
        for (int i = 0; i < reservadas_bloque.length; i++) {
            if(palabra.compareTo(reservadas_bloque[i])==0)
            {    ban=1;
                  break;
            }
        }
        if(ban==0) return false;
        else
        return true;

    }


    public void repintartex(JTextPane a) throws BadLocationException
    { String tex="";
      String pal=a.getText()+" ";
      int inicio=0,fin=0;
      int bandera=0;
      int ban=0;
      String ca ="";
        for (int i = 0; i < pal.length();i++) {
            bandera=0;
            if(inicio!=fin)
               ca=pal.substring(inicio,fin);
            if(pal.charAt(fin)!=' ' && pal.charAt(fin)!='\n' && pal.charAt(fin)!='\r')
            {   //System.out.println(""+pal.charAt(fin));
                tex+=pal.charAt(fin);
                fin++;

            }
            else
            {
              if(inicio-1>0)
                if(pal.charAt(inicio-1)=='\n')
                { ban++;
                }
               int nop=0;
              if(this.existe_pal(pal.substring(inicio,fin))==true && ban==0)
              {   nop=1;
                  if(this.existe_bloque(pal.substring(inicio,fin))==true)
                      doc.setCharacterAttributes(inicio,(fin-inicio), verde, false);
                  else
                      doc.setCharacterAttributes(inicio,(fin-inicio), azul, false);
              }
              if(this.existe_pal(pal.substring(inicio,fin))==true && ban!=0)
              { nop=1;
               if(this.existe_bloque(pal.substring(inicio,fin))==true)
                      doc.setCharacterAttributes(inicio,(fin-inicio), verde, false);
                  else
                      doc.setCharacterAttributes(inicio,(fin-inicio), azul, false);
              }
              if(nop==0 && ban==0)
                    doc.setCharacterAttributes(inicio,(fin-inicio), negro, false);
               if(nop==0 && ban!=0)
                     doc.setCharacterAttributes(inicio,(fin-inicio), negro, false);

                inicio=fin+1;
                fin++;

            }

        }



    }
    //funcion que se llama cuando le dan click a abrir archivo
    public void cargar_archivo() throws IOException{
        JFileChooser selector = new JFileChooser();
          selector.setDialogTitle("Seleccione Donde Guardara el Archivo y su Nombre");
          selector.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
          int opcion = selector.showOpenDialog(IDE);
          if(opcion==JFileChooser.APPROVE_OPTION){
                        File Archivo = selector.getSelectedFile();
                        String direccion = Archivo.getPath();                        
                        int pos = direccion.indexOf(".");
                        //System.out.println("posssssssssss "+pos);
                        direccion=direccion.substring(0,pos);
                        //System.out.println("Ruta--> "+direccion);
                        dir_com=direccion;
                        hoja.setVisible(true);
                        actualizar_area(controlador.cargar_archivo(direccion,false));
            try {
                this.repintartex(hoja);
            } catch (BadLocationException ex) {
                Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
            }
          }
          else  //que pasa si no selecciona nada
          {
              System.out.println("Cerro ");
          }
    }
    //funcion que se llama cuando le dan click a nuevo archivo
    public void crear_nuevo_archivo() throws IOException{
          JFileChooser selector = new JFileChooser();
          selector.setDialogTitle("Seleccione Donde Guardara el Archivo y su Nombre");
          selector.setFileSelectionMode(JFileChooser.APPROVE_OPTION);
          int opcion = selector.showOpenDialog(IDE);
          if(opcion==JFileChooser.APPROVE_OPTION){
                        File Archivo = selector.getSelectedFile();
                        String direccion = Archivo.getPath();
                        //System.out.println("Ruta--> "+direccion);
                        dir_com=direccion;
                        //System.out.println("nooooooooooooooo "+dir_com);
                        controlador.crear_archivo(direccion);
                        hoja.setVisible(true);
                        
                        actualizar_area(controlador.cargar_archivo(direccion,true));
                         try {
                this.repintartex(hoja);
            } catch (BadLocationException ex) {
                Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
            }
          }
          else  //que pasa si no selecciona nada
          {
              System.out.println("Cerro ");
          }
    }

    public void actualizar_area(List<String> lineas){
        hoja.setText("");
        String todo="";
        for(String i:lineas){
            todo+=i+"\n";
        }
        hoja.setText(todo);
         try {
                this.repintartex(hoja);
            } catch (BadLocationException ex) {
                Logger.getLogger(Vista.class.getName()).log(Level.SEVERE, null, ex);
            }
    }


}
